home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1833 / 1833.xpi / chrome / yoono.jar / ff2 / bookmarks-restore.js next >
Text File  |  2009-12-16  |  7KB  |  237 lines

  1. /*!
  2.  * bkmRestoreService
  3.  * 
  4.  * Restore/Save bookmarks changes
  5.  * @author : david marteau <marteau.david@free.fr>
  6.  */
  7.  
  8. const CI = Components.interfaces;
  9. const CL = Components.classes;
  10.  
  11. const RDF     = CL['@mozilla.org/rdf/rdf-service;1'].getService(CI.nsIRDFService);
  12. const RDFC    = CL["@mozilla.org/rdf/container-utils;1"].getService(CI.nsIRDFContainerUtils);
  13. const DIRS    = CL['@mozilla.org/file/directory_service;1'].getService(CI.nsIProperties);
  14.  
  15. const NC_NS     = "http://home.netscape.com/NC-rdf#";
  16. const NC_NS_CMD = NC_NS + "command?cmd=";
  17.  
  18. const WMED = CL['@mozilla.org/appshell/window-mediator;1'].getService(CI.nsIWindowMediator);
  19.  
  20. var BMKS = null;
  21.  
  22. const NAME_RESOURCE           = RDF.GetResource("http://home.netscape.com/NC-rdf#Name");
  23.  
  24. function RDFGetName(resource) {
  25.         var nameRes = gDataSource.GetTarget(resource, NAME_RESOURCE, true);
  26.         if (nameRes)
  27.             return nameRes.QueryInterface(CI.nsIRDFLiteral).Value;
  28.         return "";
  29. }
  30.  
  31. function getDefaultPersonalToolbarName() {
  32.   var win=WMED.getMostRecentWindow("navigator:browser");
  33.   return win.document.getElementById("PersonalToolbar").getAttribute("toolbarname");
  34. }
  35.  
  36. /*!
  37.  * Execute a command with the given source and arguments
  38.  */
  39. function doBookmarksCommand(aSource, aCommand, aArgumentsArray)
  40. {
  41.     var rCommand = RDF.GetResource(aCommand);
  42.   
  43.     const kSuppArrayContractID = "@mozilla.org/supports-array;1";
  44.     const kSuppArrayIID        = CI.nsISupportsArray;
  45.     
  46.     var sourcesArray = CL[kSuppArrayContractID].createInstance(kSuppArrayIID);
  47.     if(aSource) {
  48.        sourcesArray.AppendElement(aSource);
  49.     }
  50.   
  51.     var argsArray = CL[kSuppArrayContractID].createInstance(kSuppArrayIID);
  52.     var length = aArgumentsArray?aArgumentsArray.length:0;
  53.     
  54.     for (var i = 0; i < length; ++i) 
  55.     {
  56.       var rArc = RDF.GetResource(aArgumentsArray[i].property);
  57.       argsArray.AppendElement(rArc);
  58.       var rValue = null;
  59.       
  60.       if ("resource" in aArgumentsArray[i])
  61.         rValue = RDF.GetResource(aArgumentsArray[i].resource);
  62.       else
  63.         rValue = RDF.GetLiteral(aArgumentsArray[i].literal);
  64.  
  65.       argsArray.AppendElement(rValue);
  66.     }
  67.  
  68.     // Exec the command in the Bookmarks datasource. 
  69.     BMKS.DoCommand(sourcesArray, rCommand, argsArray);
  70. }
  71.  
  72.  
  73. /*!
  74.  * Delete a resource and all its descendant (hard way)
  75.  */
  76. function deleteResource( ds, aSource )
  77. {
  78.   var arcs = ds.ArcLabelsOut(aSource);    
  79.   while (arcs.hasMoreElements()) 
  80.   {
  81.     var property = arcs.getNext().QueryInterface(CI.nsIRDFResource);
  82.     var target   = ds.GetTarget(aSource,property,true);
  83.  
  84.     // Test if the arc points to a child.
  85.     if(RDFC.IsOrdinalProperty(property))
  86.     {
  87.       // Recusively delete childs
  88.       deleteResource(ds,target.QueryInterface(CI.nsIRDFResource));
  89.     }
  90.  
  91.     ds.Unassert(aSource,property,target);
  92.   }
  93. }
  94.  
  95.  
  96. /*!
  97.  * Remove childs of a resource but not the resource itself
  98.  */
  99. function removeChilds( ds, aSource )
  100. {
  101.    var container = CL["@mozilla.org/rdf/container;1"]
  102.            .createInstance(CI.nsIRDFContainer);     
  103.   
  104.     container.Init(ds,aSource); 
  105.  
  106.     var elems = new Array();
  107.  
  108.     var elements = container.GetElements();  
  109.     while(elements.hasMoreElements()) 
  110.           elems.push(elements.getNext()
  111.             .QueryInterface(CI.nsIRDFResource));
  112.  
  113.     for( var i=0;i<elems.length;++i ) 
  114.     {
  115.       var res = elems[i];
  116.       if(res == BMKS.getBookmarksToolbarFolder())
  117.          removeChilds(ds,res);
  118.       else {
  119.          container.RemoveElement( res, false );
  120.          deleteResource(ds,res);
  121.       }
  122.     }
  123. }
  124.  
  125.  
  126. function spliceContainer( ds , aRes, bRes )
  127. {
  128.    var aContainer = CL["@mozilla.org/rdf/container;1"].createInstance(CI.nsIRDFContainer);
  129.                      
  130.    var bContainer = CL["@mozilla.org/rdf/container;1"].createInstance(CI.nsIRDFContainer);     
  131.  
  132.    aContainer.Init(ds,aRes);
  133.    bContainer.Init(ds,bRes);
  134.        
  135.    var elements = aContainer.GetElements();  
  136.    while(elements.hasMoreElements()) 
  137.    {
  138.      var item = elements.getNext().QueryInterface(CI.nsIRDFNode);
  139.      bContainer.AppendElement(item);
  140.      aContainer.RemoveElement(item,false);
  141.    }
  142. }
  143.  
  144.  
  145.  
  146. function backup( file ) {
  147.     try {
  148.         if (!BMKS) {
  149.             BMKS  = RDF.GetDataSource("rdf:bookmarks");
  150.             BMKS.QueryInterface(CI.nsIBookmarksService);
  151.         }
  152.         
  153.         BMKS.QueryInterface(CI.nsIRDFRemoteDataSource);
  154.         BMKS.Flush();
  155.         
  156.         // Copy current Bookmark file
  157.         var bookmarksFile = DIRS.get("BMarks",CI.nsIFile);
  158.         bookmarksFile.copyTo(file.parent,file.leafName);
  159.         
  160.     } catch(e) {
  161.         log.exception(e);
  162.     }
  163. }
  164.  
  165.  
  166.   
  167. function restore( file ) {
  168. try {
  169.     if (!BMKS) {
  170.         BMKS  = RDF.GetDataSource("rdf:bookmarks");
  171.         BMKS.QueryInterface(CI.nsIBookmarksService);
  172.     }
  173.     
  174.     BMKS.beginUpdateBatch();
  175.  
  176.     var root = RDF.GetResource("NC:BookmarksRoot");
  177.  
  178.     // Clear bookmarks
  179.     removeChilds(BMKS,root);
  180.  
  181.     // Import bookmarks from archives
  182.     var args = [{ property: NC_NS+"URL", literal: file.path }];
  183.     doBookmarksCommand(root, NC_NS_CMD+"import", args);
  184.     
  185.   
  186.     var container = CL["@mozilla.org/rdf/container;1"].createInstance(CI.nsIRDFContainer);     
  187.  
  188.     container.Init(BMKS,root);
  189.     var elements = container.GetElements();  
  190.     
  191.     // Toolbar folder is an immutable element
  192.     // and the personal toolbar is hooked on it.
  193.     // So we need to move content from stored toolbarfolder
  194.     // to the actual toolbarfolder.
  195.     // All is done under the assumption that the toolbarfolder
  196.     // is the first element in the root container
  197.  
  198.     var toolbarFolder = BMKS.getBookmarksToolbarFolder();
  199.   var toolbarName = getDefaultPersonalToolbarName();
  200.   
  201.   // Find new toolbar loaded by import command (but not filled into the real personal toolbar :/
  202.   var newToolbar=null;
  203.   
  204.   while(elements.hasMoreElements()) {
  205.     var res=elements.getNext().QueryInterface(CI.nsIRDFResource);
  206.     if (RDFGetName(res)==toolbarName && res!=toolbarFolder) {
  207.       newToolbar=res;
  208.       break;
  209.     }
  210.   }
  211.   
  212.   // Fill the correct toolbar
  213.   if (newToolbar) {
  214.       if(toolbarFolder) {
  215.           spliceContainer(BMKS,newToolbar,toolbarFolder);
  216.           container.RemoveElement(newToolbar,true);
  217.       } else {
  218.           // Hum, no toolbar folder set the first entry
  219.           // from our new bookmarks set
  220.           BMKS.setBookmarksToolbarFolder(newToolbar);        
  221.       } 
  222.     }
  223.   
  224.     BMKS.endUpdateBatch();
  225.     
  226.     // Force refresh immediately
  227.     BkmsObserverFF2.forceUpdate();
  228.     
  229.     return true;
  230. } catch(e) {
  231.   log.exception(e);
  232. }
  233. }
  234.  
  235.  
  236.  
  237.